"""
这个模块实现了特定目标的容器，以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。

Counter
    字典的子类，提供了可哈希对象的计数功能
    Counter对象支持以下三个字典不支持的方法，elements()，most_common()，subtract()；
        element():
            返回一个迭代器，每个元素重复的次数为它的数目，顺序是任意的顺序，如果一个元素的数目少于1，那么elements()就会忽略它
        most_common():
            返回一个列表，包含counter中n个最大数目的元素
        subtract():
            从一个可迭代对象中或者另一个映射（或counter）中，元素相减
            ```code
            >> a = Counter(a=4,b=2,c=0,d=-2)
            >> b = Counter(a=1,b=2,c=-3,d=4)
            >> a.subtract(d)
            >> a
            Counter({'a': 3, 'c': 3, 'b': 0, 'd': -6})
            ```
        update():
            从一个可迭代对象中或者另一个映射（或counter）中所有元素相加
            ```code
            >> c = Counter(a=4,b=2,c=0,d=-2)
            >> d = Counter(a=1,b=2,c=-3,d=4)
            >> c.update(d)
            >> c
            Counter({'a': 5, 'c': 4, 'b': -3, 'd': 2})
            ```

OrderedDict
    字典的子类，保存了他们被添加的顺序

defaultdict
    字典的子类，提供了一个工厂函数，为字典查询提供一个默认值


namedtuple()
    创建命名元组子类的工厂函数

deque
    类似列表(list)的容器，实现了在两端快速添加(append)和弹出(pop)

ChainMap
    类似字典(dict)的容器类，将多个映射集合到一个视图里面


"""
from collections import Counter, defaultdict


def counter_example():
    # c1 c2 c3 三者等价
    c1 = Counter(['a', 'a', 'a', 'b', 'b'])
    c2 = Counter({'a': 3, 'b': 2})
    c3 = Counter(a=3, b=2)

    print(c1['a'])
    print(c2['a'])
    print(c3['a'])

    for element in c3.elements():
        print(element)

    # 输出数量最大的n个元素
    print(c3.most_common(1))


def default_dict_example():
    _list = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
    d = defaultdict(list)
    for k, v in _list:
        d[k].append(v)

    print(d.items())  # dict_items([('red', [1, 3, 1]), ('blue', [2, 4, 4])])


default_dict_example()

from collections import Counter

qs = [
    {'id': 1, 'time': 1111},
    {'id': 1, 'time': 1111},
    {'id': 1, 'time': 1111},
    {'id': 1, 'time': 1111},
    {'id': 1, 'time': 1111},
    {'id': 1, 'time': 1111},
    {'id': 1, 'time': 1111},
    {'id': 1, 'time': 2222},
    {'id': 1, 'time': 2222},
    {'id': 1, 'time': 2222},
    {'id': 1, 'time': 2222},
    {'id': 1, 'time': 2222},
]


d = {}
for obj in qs:
    d.setdefault(obj['time'], 0)
    d[obj['time']] += 1

print(d)
